﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CapaDatos;
using CapaDeEntidades;

namespace CapaNegocio
{
    public class Controladora
    {

        #region USUARIO

        public static bool ValidarUsuario(string usuario, string pass)
        {
            Socio socio = new Socio();
            socio.Usuario = usuario;
            socio.Pass = pass;

            return UsuarioDao.VerificaUsuario(socio);
        }

        #endregion

        #region PRESTAMO

        public static bool GenerarPrestamo(DateTime fechaPrestamo, int idLibro, int idSocio)
        {

            Prestamo prestamo = new Prestamo();
            prestamo.FechaPrestamo = DateTime.Today;
            prestamo.Libro = new Libro();
            prestamo.Libro.IdLibro = idLibro;
            prestamo.Socio = new Socio();
            prestamo.Socio.Codigo = idSocio;
            prestamo.FechaDevolucion = DateTime.Today.AddDays(7);//Se deberia devolver en una semana??
            //prestamo.FechaRealDevolucion No le seteo nada para que quede NULL

            return PrestamoDao.GenerarPrestamo(prestamo);
        }



        public static DataSet ObtenerPrestamosPorSocio(int idSocio)
        {

            Prestamo prestamo = new Prestamo();
            prestamo.Socio = new Socio();
            prestamo.Socio.Codigo = idSocio;
            DataSet datos = new DataSet();
            datos = PrestamoDao.ObtenerPrestamosPorSocio(prestamo);
            return datos;

        } //OBTIENE ABSOLUTAMENTE TODOS LOS PRESTAMOS DEL SOCIO

        public static DataSet ObtenerPrestamosVencidosPorSocio(int idSocio)
        {
            Prestamo prestamo = new Prestamo();
            prestamo.Socio = new Socio();
            prestamo.Socio.Codigo = idSocio;

            return PrestamoDao.ObtenerPrestamosVencidosPorSocio(prestamo);
        }




        public static bool RegistrarDevolucion(int idPrestamo)
        {
            Prestamo prestamo = new Prestamo();
            prestamo.IdPrestamo = idPrestamo;

            return PrestamoDao.RegistrarDevolucionPrestamo(prestamo);
        }

        #endregion

        #region SOCIO

        public static bool RegistrarSocio(long dni, string nombre, string mail, string usuario, string pass)
        {
            Socio socio = new Socio();
            socio.Dni = dni;
            socio.NombreApellido = nombre;
            socio.email = mail;
            socio.Usuario = usuario;
            socio.Pass = pass;

            return SocioDao.RegistrarSocio(socio);
        }

        public static bool ModificarSocio(long dni, string nombre, string mail, string usuario, string pass)
        {
            Socio socio = new Socio();
            socio.Dni = dni;
            socio.NombreApellido = nombre;
            socio.email = mail;
            socio.Usuario = usuario;
            socio.Pass = pass;

            return SocioDao.ModificarSocio(socio);
        }

        public static bool DarDeBajaSocio(long dni)
        {
            Socio socio = new Socio();
            socio.Dni = dni;

            return SocioDao.DarBajaSocio(socio);
        }

        public static Socio ConsultarDatosSocio(string userName)
        {
            Socio socio = new Socio();
            socio.Usuario = userName;
            DataSet ds = SocioDao.ConsultarSocio(socio);
            foreach (DataRow r in ds.Tables[0].Rows)
            {
                socio.Codigo = Convert.ToInt32(r["codigo"].ToString());
                socio.email = r["mail"].ToString();
                socio.NombreApellido = r["nombre"].ToString();
                socio.Dni = Convert.ToInt32(r["dni"].ToString());
            }
            return socio;
        }

        #endregion

        #region RESERVA

        public static bool RegistrarReserva(int idLibro, int idSocio)
        {
            Reserva reserva = new Reserva();
            reserva.Libro = new Libro();
            reserva.Libro.IdLibro = idLibro;
            reserva.Socio = new Socio();
            reserva.Socio.Codigo = idSocio;
            reserva.FechaReserva = DateTime.Now;
            reserva.FechaFinReserva = DateTime.Today.AddDays(7);

            return ReservaDao.RegistrarReserva(reserva);
        }

        public static int ObtenerReservasPorLibro(int idLibro)
        {
            Libro libro = new Libro();
            libro.IdLibro = idLibro;

            DataSet ds = ReservaDao.ObtenerReservasPorLibro(libro);
            int count = 0;
            if (ds.Tables.Count > 0)
            {
                count = ds.Tables[0].Rows.Count;
            }
            return count;
        }

        public static bool consultarDisponibilidadLibroPrestamo(int idLibro, int cantEjemplares)
        {
            int cantPrestamos = ObtenerCantPrestamosPorLibro(idLibro);
            if (cantPrestamos < cantEjemplares)
                return true;
            else
                return false;
        }

        public static bool consultarDisponibilidadRenovarPrestamoLibro(int idSocio, int idLibro, int cantEjemplares)
        {

            // Verificar que no existan reservas pendientes sobre ese libro
            int cantPrestamosVencidos = 0;
            //Verificar que no existan devoluciones pendientes,  es decir que este fuera de termino la fecha de prestamo
            int cantReservas = ObtenerReservasPorLibro(idLibro);
            if (ObtenerPrestamosVencidosPorSocio(idSocio) != null)
            { cantPrestamosVencidos = ObtenerPrestamosVencidosPorSocio(idSocio).Tables[0].Rows.Count; }

            if (cantPrestamosVencidos == 0 && cantReservas == 0)
                return true;

            else
                return false;
        }



        public static int ObtenerCantPrestamosPorLibro(int idLibro)
        {
            Libro libro = new Libro();
            libro.IdLibro = idLibro;

            DataSet ds = LibroDao.ObtenerPrestamosPorLibro(libro);
            int count = 0;
            if (ds.Tables.Count > 0)
            {
                count = ds.Tables[0].Rows.Count;
            }
            return count;
        }

        public static bool consultarDisponibilidadLibroReserva(int idLibro, int cantEjemplares)
        {
            int cantReservas = ObtenerReservasPorLibro(idLibro);
            int cantPrestamos = ObtenerCantPrestamosPorLibro(idLibro);
            if (cantPrestamos == cantEjemplares && cantReservas < cantEjemplares)
                return true;
            else
                return false;
        }

        public static DataSet ObtenerReservasPorSocio(int idSocio)
        {
            Reserva reserva = new Reserva();
            reserva.Socio = new Socio();
            reserva.Socio.Codigo = idSocio;

            return ReservaDao.ObtenerReservasPorSocio(reserva);

        }

        #endregion

        #region LIBRO

        public static bool RegistrarLibro(string autor, int cantEj, long isbn, string titulo)
        {
            Libro libro = new Libro();
            libro.Autor = autor;
            libro.CantEj = cantEj;
            libro.Isbn = isbn;
            libro.Titulo = titulo;

            return LibroDao.RegistrarLibro(libro);
        }

        public static bool ModificarLibro(int idLibro, string autor, int cantEj, long isbn, string titulo)
        {
            Libro libro = new Libro();
            libro.Autor = autor;
            libro.CantEj = cantEj;
            libro.Isbn = isbn;
            libro.Titulo = titulo;
            libro.IdLibro = idLibro;


            return LibroDao.ModificarLibro(libro);
        }

        public static bool DarDeBajaLibro(int idLibro)
        {
            Libro libro = new Libro();
            libro.IdLibro = idLibro;
            return LibroDao.DarBajaLibro(libro);
        }

        public static IList<Libro> DevolverCatalogoLibros()
        {
            IList<Libro> listaLibros = new List<Libro>();
            DataSet ds = LibroDao.ConsultaCatalogoLibros();
            foreach (DataRow r in ds.Tables[0].Rows)
            {
                Libro libro = new Libro();
                if (r["idLibro"].ToString() != "")
                {
                    libro.IdLibro = Convert.ToInt32(r["idLibro"].ToString());
                }
                if (r["autor"].ToString() != "")
                {
                    libro.Autor = r["autor"].ToString();
                }
                if (r["titulo"].ToString() != "")
                {
                    libro.Titulo = Convert.ToString(r["titulo"]);
                }
                if (r["cantEj"].ToString() != "")
                {
                    libro.CantEj = Convert.ToInt32(r["cantEj"]);
                }
                if (r["isbn"].ToString() != "")
                {
                    libro.Isbn = Convert.ToInt32(r["isbn"]);
                }
                listaLibros.Add(libro);
            }
            return listaLibros;
        }



        public static DataSet VerCatalogoLibros()
        {
            DataSet ds = LibroDao.ConsultaCatalogoLibros();
            return ds;
        }

        #endregion






    }
}
